/**
*   @file    Dbgu.c
*   MRTB-05 Project
*
*   @{
*/
/*==================================================================================================
*   Project              : MRTB-05
*   Platform             : SBC6000X, AT91SAM9261S
*   Build Version        : Keil uVision 4.53
*
*   (c) Copyright VNE Corporation
*   All Rights Reserved.
==================================================================================================*/

/*==================================================================================================
*                                        INCLUDE FILES
==================================================================================================*/
#include "Dbgu.h"
#include "Rte.h"
#include "stdio.h"
#include "stdlib.h"
#include "AT91SAM9261.h"

/*==================================================================================================
*                          LOCAL TYPEDEFS (STRUCTURES, UNIONS, ENUMS)
==================================================================================================*/


/*==================================================================================================
*                                       LOCAL MACROS
==================================================================================================*/


/*==================================================================================================
*                                      LOCAL CONSTANTS
==================================================================================================*/


/*==================================================================================================
*                                      LOCAL VARIABLES
==================================================================================================*/


/*==================================================================================================
*                                      GLOBAL CONSTANTS
==================================================================================================*/


/*==================================================================================================
*                                      GLOBAL VARIABLES
==================================================================================================*/


/*==================================================================================================
*                                       GLOBAL FUNCTIONS
==================================================================================================*/
void DbguInit(uint32 dwBaudRate, uint32 dwMasterClock)
{
    uint32 baud_value;

    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB;

    /* Configure PIO controllers to peripheral mode */
    AT91C_BASE_PIOA->PIO_PDR = (AT91C_PA10_DTXD | AT91C_PA9_DRXD);
    AT91C_BASE_PIOA->PIO_ASR = (AT91C_PA10_DTXD | AT91C_PA9_DRXD);

    /* Configure USART DBGU */
    /* Disable interrupts */
    AT91C_BASE_DBGU->DBGU_IDR = (uint32)-1;

    /* Reset receiver and transmitter */
    AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ;

    /* Define the baud rate divisor register */
    baud_value = ((dwMasterClock * (uint32)10)/(dwBaudRate * (uint32)16));
    if ((baud_value % (uint32)10) >= 5)
        baud_value = (baud_value / (uint32)10) + 1;
    else
        baud_value /= (uint32)10;

    AT91C_BASE_DBGU->DBGU_BRGR = baud_value;


    /* Disable the RX and TX PDC transfer requests */
    AT91C_BASE_DBGU->DBGU_RPR = AT91C_PDC_RXTDIS;
    AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_TXTDIS;

    /* Define the USART mode */
    AT91C_BASE_DBGU->DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_NONE;

    /* Enable Transmitter */
    AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN;
    AT91C_BASE_DBGU->DBGU_CR = AT91C_US_TXEN;
}

void DbguPrint(uint8 *str)
{
    uint32 cntChar = (uint32)0UL;

    SchM_Enter_DBGU_EXCLUSIVE_AREA_00();
	while(*str != '\0')
	{
        while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY));
		AT91C_BASE_DBGU->DBGU_THR = *str++;
        cntChar++;
        if(MAX_NUM_CHAR == cntChar)
            break;
	}
    SchM_Exit_DBGU_EXCLUSIVE_AREA_00();
}

void DbguReport(uint16 ModuleId, uint16 FuncId, uint16 ErrorId)
{
    uint8 strLog[MAX_NUM_CHAR];

    sprintf(strLog, "Error : Module (%03d), Function (%03d), Error code (%03d)", ModuleId, FuncId, ErrorId);

    DbguPrint(strLog);
}

/** @} */

